package com.link.base.base.crowd.service;

import com.link.base.base.crowd.model.Crowd;
import com.link.base.base.crowd.model.CrowdFilePath;
import com.link.core.basic.service.BasicService;

import java.util.Date;
import java.util.List;

/**
 * 人群圈选
 *
 * @author 何启谦
 * @date 2019-02-14
 */
public interface CrowdService extends BasicService<Crowd> {

    /**
     * 新建人群包，包含一级集合、二级集合和集合类型
     *
     * @param entity 人群对象
     * @return 人群对象
     * @throws Exception sql异常
     */
    Crowd insertCrowd(Crowd entity) throws Exception;

    /**
     * 复制人群包，包含一级集合、二级集合和集合类型
     *
     * @param crowdId 人群ID
     * @return 人群，包含多层子对象
     * @throws Exception sql异常
     */
    Crowd copyCrowd(Long crowdId) throws Exception;

    /**
     * 根据ID查询单个完整的人群包，包含一级集合、二级集合和集合类型
     *
     * @param crowdId 人群ID
     * @return 人群，包含多层子对象
     * @throws Exception sql异常
     */
    Crowd queryFullCrowdById(Long crowdId) throws Exception;

    /**
     * 失效人群包
     *
     * @param crowdId 人群ID
     * @throws Exception sql异常
     */
    void invalidate(Long crowdId) throws Exception;

    /**
     * 修改"sql记录"字段
     *
     * @param crowdId   人群ID
     * @param sqlRecord sql记录
     */
    void sqlRecordUpdate(Long crowdId, String sqlRecord) throws Exception;

    /**
     * 修改"Mapping状态"字段
     *
     * @param crowdId       人群ID
     * @param mappingStatus Mapping状态
     * @param consumerCount 数据规模(消费者数量)
     * @throws Exception sql异常
     */
    void mappingStatusUpdate(Long crowdId, String mappingStatus, Integer consumerCount) throws Exception;

    /**
     * 更新"最后一次匹配消费者成功的时间"
     *
     * @param crowdId  人群ID
     * @param datetime 时间
     */
    void mappingTimeUpdate(Long crowdId, Date datetime) throws Exception;

    /**
     * 根据人群对象，来收集消费者ID
     *
     * @param crowd 人群对象
     * @throws Exception sql异常
     */
    void collectConsumer(Crowd crowd) throws Exception;

    /**
     * 根据人群对象，来收集消费者ID，通过子线程异步实现
     *
     * @param crowd 人群对象
     */
    void collectConsumerByThread(Crowd crowd);

    /**
     * 上传人群包包含的消费者数据文件到tdc
     * @author 秦学刚
     * @param list 人群对象列表
     */

    List<CrowdFilePath> uploadCrowdToTdc(List<Crowd> list) throws Exception;
}
